/*
 * Copyright 2004-2005 asoft
 * 本软件及其所有拷贝的名称，与光盘上或本软件中注明的公司同在。
 * 本软件及文档享有版权，并受国家版权法及国际协约条款的保护。
 * 您不可以从本软件中去掉其版权声明；并保证为本软件的拷贝（本部或部分）* 复制版权声明。
 * 您同意制止以任何形式非法拷贝本软件及文档。
 * 版权信息参见：
 *      http://www.asoft.cn/licenses
 */

package com.asoft.common.base.web.service;

import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import com.asoft.common.base.web.view.ToNode;
import com.asoft.common.logs.util.AsoftLogsException;

/**
 * 查询树服务
 *
 *  created by amon 2005-9-3 16:19
 */

public abstract class AbstractTreeService extends AbstractFindService
{
        static Logger logger = Logger.getLogger(AbstractTreeService.class);

        private static boolean  hasInitCheck = false ;

        /** 角色 */
        private String role;

        public String getRole()
        {
                return this.role;
        }

        public void setRole(String role)
        {
                this.role = role;
        }

        /** 创建 models */
	public abstract void createModels(Map modelsMap,
	                                  HttpServletRequest request);

        /** 设置nodeModel's views */
        public abstract void setNodeViews(Map viewsMap,
                                          HttpServletRequest request);

        /** 执行服务 */
        public void executeService(HttpServletRequest request)
        {
                logger.info("开始执行构建树图服务");
                Map modelsMap = new HashMap(); // models's Map
                Map viewsMap = new HashMap(); // views's Map
                logger.debug("开始构建models");
                this.createModels(modelsMap,request);
                logger.debug("开始构建views");
                this.setNodeViews(viewsMap,request);
                logger.info("开始检测model与view的匹配情况");
                this.treeInitCheck(modelsMap,viewsMap);
                logger.debug("开始构建树节点(node = model + view)");
                request.setAttribute("AllNodes",this.models2Views(modelsMap,viewsMap));
        }

        /**
         * models转换成对应的节点view
         *
         * @ param: modelsMap key: model类别(自定义) value: model
         * @ param: viewsMap  key: model类别(自定义) value: modue
         * @ return: 所有待显示的节点view
         */
        public List models2Views(Map modelsMap,Map viewsMap)
        {
                Set allNodes = new LinkedHashSet(modelsMap.size() * 20);
                List keys = new Vector(modelsMap.keySet());
                Collections.sort(keys);
                for(int i = 0; i < keys.size(); i ++)
                {
                        Object key = keys.get(i);
                        Object mobj = modelsMap.get(key);
                        ToNode toNode = (ToNode)viewsMap.get(key);
                        toNode.setModelOrModels(mobj);
                        toNode.putNodes(allNodes);
                }
                return new Vector(allNodes);
        }

        /**
         * 检测 models 和 views的匹配情况
         *
         * @ param: modelsMap key: model类别(自定义) value: model
         * @ param: viewsMap  key: model类别(自定义) value: modue
         */
        public void treeInitCheck(Map modelsMap,Map viewsMap)
        {
                if(hasInitCheck)
                {
                        logger.debug("之前已经检测过了");
                        return;
                }
                else
                {
                        logger.debug("第一次检测初始化情况，开始检测");
                        hasInitCheck = true;
                }
                Set modelsKeys = modelsMap.keySet();
                Set viewsKeys = viewsMap.keySet();
                if(modelsKeys.size() != viewsKeys.size())
                {
                         throw new TreeInitException("modelsMap和viewsMap数量不匹配(" + modelsKeys.size() + " : " + viewsKeys.size() + ")");
                }
                if(!modelsKeys.containsAll(viewsKeys))
                {
                         throw new TreeInitException("viewsMap含有modelsMap尚未含有的元素");
                }
                if(!viewsKeys.containsAll(modelsKeys))
                {
                         throw new TreeInitException("modelsMap含有viewsMap尚未含有的元素");
                }
        }

        /** 执行服务前（for 操作日志）*/
        public String getDetailBeforeExe(HttpServletRequest request)
        {
                throw new AsoftLogsException("方法public String getDetailBeforeExe(HttpServletRequest request) 未实现");
        }

        /** 执行服务后（for 操作日志）*/
        public String getDetailAfterExe(HttpServletRequest request)
        {
                throw new AsoftLogsException("方法public String getDetailAfterExe(HttpServletRequest request) 未实现");
        }
}
